#include "TDACorreo.h"
#include "logdebug.h"

#include <string.h>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include "listasimple.h"
#include "TDACorreo.h"

/*TODAS LAS PRIMITIVAS PROBADAS Y FUNCIONANDO*/

void crearCorreo(TDACorreo* correo){

   /*Creo un correo nuevo con su contenido en blanco y sin destinatarios (lista de destinatarios vacia)*/
   setRemitente(correo,"\0");
   ls_Crear(&correo->Para, sizeof(Telem));
   setAsunto(correo,"\0");
   setTextoCuerpo(correo,"\0");
   setFechaHoraEnviado(correo,0);

}

void destruirCorreo(TDACorreo* correo){

   /*Vacio la lista de destinatarios los destinatarios y borro el contenido del correo */
   setRemitente(correo,"\0");
   if (ls_Vacia(correo->Para)==FALSE)
    ls_Vaciar(&correo->Para);
   setAsunto(correo,"\0");
   setTextoCuerpo(correo,"\0");
   setFechaHoraEnviado(correo,0);

}

void getRemitente(TDACorreo correo, char* remitente) {
	strcpy(remitente, correo.De);
}

void setRemitente(TDACorreo* correo, char* remitente) {
	strcpy(correo->De, remitente);
}

void getDestinatarios(TDACorreo correo, TListaSimple *destinatarios) {
    Telem elem;
    int mov_ok=TRUE;

    /*Recorro la lista de destinatarios del correo y los voy copiando a la lista destinatarios suministrada*/
    if(ls_Vacia(correo.Para)==FALSE) {
        ls_MoverCorriente(&correo.Para,LS_PRIMERO);
        while (mov_ok==TRUE) {
            ls_ElemCorriente(correo.Para,&elem);
            if(ls_Vacia(*destinatarios))
                ls_Insertar(destinatarios,LS_PRIMERO,&elem);
            else
                ls_Insertar(destinatarios,LS_SIGUIENTE,&elem);
            mov_ok=ls_MoverCorriente(&correo.Para,LS_SIGUIENTE);
        }
    }
}

int getCantidadDestinatarios(TDACorreo correo) {
	int cantidad=0, mov_ok=TRUE;

	/*Recorro la lista y voy incrementando cantidad mientras tenga elementos en la lista*/
	if(ls_Vacia(correo.Para)==FALSE) {
        ls_MoverCorriente(&correo.Para,LS_PRIMERO);
        while(mov_ok==TRUE) {
            cantidad++;
            mov_ok=ls_MoverCorriente(&correo.Para,LS_SIGUIENTE);
        }
	}
	return cantidad;
}

int setDestinatario(TDACorreo* correo, char* destinatario) {
	int res;
	Telem elem;
	strcpy(elem.direccion,destinatario);
	elem.estado = NO_RECIBIDO;

	/*Inserto el elemento segun corresponda*/
	if(ls_Vacia(correo->Para))
	    res=ls_Insertar(&correo->Para,LS_PRIMERO, &elem);
	else
        res=ls_Insertar(&correo->Para,LS_SIGUIENTE, &elem);

	return res;
}

int eliminarDestinatario(TDACorreo *correo, const char* dest) {
    int mov_ok=TRUE;
    Telem elem;
    int found=FALSE;

    /*Recorro la lista hasta encontrar el destinatario y eliminarlo*/
	if(ls_Vacia(correo->Para)==FALSE) {
        ls_MoverCorriente(&correo->Para,LS_PRIMERO);
        while((mov_ok==TRUE) && (found==FALSE)) {
            ls_ElemCorriente(correo->Para, &elem);
            if (strcmp(elem.direccion,dest)==0){
                ls_BorrarCorriente(&correo->Para);
                found=TRUE;
            }
            mov_ok=ls_MoverCorriente(&correo->Para,LS_SIGUIENTE);
        }
	}
	return found;
}

time_t getFechaHoraEnviado(TDACorreo correo) {
	return correo.Fecha;
}

void setFechaHoraEnviado(TDACorreo* correo, time_t fechaHora) {
	correo->Fecha = fechaHora;
}

void getAsunto(TDACorreo correo, char* asunto) {
	strcpy(asunto, correo.Asunto);
}

void setAsunto(TDACorreo* correo, char* asunto) {
	strcpy(correo->Asunto, asunto);
}

void getTextoCuerpo(TDACorreo correo, char* textoCuerpo) {
	strcpy(textoCuerpo, correo.Cuerpo);
}

void setTextoCuerpo(TDACorreo* correo, char* textoCuerpo) {
	strcpy(correo->Cuerpo, textoCuerpo);
}

int importarDesde(TDACorreo* correo, FILE* archivo) {

	/*Me ubico en el principio del archivo*/
	rewind(archivo);

	/*Reservo una posicion de memoria para las lecturas auxiliares en el archivo*/
	char auxA[MAX_BODY_SIZE], auxB[MAX_ADDR_SIZE], auxC[MAX_SUBJECT_SIZE], auxD[MAX_BODY_SIZE];

	/*Cargo el contenido de la etiqueta ETIQUETA_DE*/
	fscanf(archivo, "%s %s", auxA, auxB);
	if (strcmp(auxA,ETIQUETA_DE) != 0) {
        logmacro("%s", "Error de formato en el archivo de entrada");
        return 1;
	} setRemitente(correo, auxB);

	/*Cargo el contenido de la etiqueta ETIQUETA_PARA*/
	fscanf(archivo, "%s", auxA);
	if (strcmp(auxA,ETIQUETA_PARA) != 0) {
        logmacro("%s", "Error de formato en el archivo de entrada");
        return 1;
	}
	while ((fscanf(archivo, "%s", auxB) != EOF) && (strcmp(auxB,ETIQUETA_ASUNTO) != 0))  {
	    /*Mientras no haya pasado a la sig etiqueta o no haya llegado al fin de archivo sigo seteando destinat.*/
	    setDestinatario(correo, auxB);
	}

    /*Cargo el contenido de la etiqueta ETIQUETA_ASUNTO*/
    if (strcmp(auxB,ETIQUETA_ASUNTO) != 0) { /*Si el formato es correcto, en AuxB tengo el valor ETIQUETA_ASUNTO*/
        logmacro("%s", "Error de formato en el archivo de entrada");
        return 1;
	}
	if(fscanf(archivo, "%s", auxC) != EOF) /*Si no llegué al final de arch y cumplo todo hasta aca tengo asunto*/
        setAsunto(correo, auxC);
    else {
         logmacro("%s", "Error de formato en el archivo de entrada");
         return 1;
    }

	/*Cargo el cuerpo del mensaje*/
    if(fgets(auxD, MAX_BODY_SIZE,archivo) != NULL) { /*Compruebo por si el cuerpo esta vacio*/
        while(fgets(auxA, MAX_BODY_SIZE, archivo) != NULL) /*Mientras haya palabras en el cuerpo las agrego*/
            strcat(auxD, auxA);
        setTextoCuerpo(correo, auxD);
    }
    else
        setTextoCuerpo(correo,"\n\0");
	return 0;
}

int escribirA(TDACorreo correo, FILE* archivo) {
    time_t date;
    struct tm *tmPtr;
    char cad[DATE_SIZE];
    Telem elem;
    int mov_ok=TRUE;

	/*Cargo el contenido de la etiqueta ETIQUETA_DE*/
	fprintf(archivo, "%s %s\n", ETIQUETA_DE, correo.De);

    /*Cargo el contenido de la etiqueta ETIQUETA_PARA*/
    fprintf(archivo, "%s ", ETIQUETA_PARA);
    if(ls_Vacia(correo.Para)==FALSE) {
        ls_MoverCorriente(&correo.Para,LS_PRIMERO);
        while(mov_ok==TRUE) {
            ls_ElemCorriente(correo.Para, &elem);
            fprintf(archivo, "%s ", elem.direccion);
            mov_ok=ls_MoverCorriente(&correo.Para, LS_SIGUIENTE);
        }
    }
    fprintf(archivo, "\n");

    /*Cargo el contenido de la etiqueta Subject*/
    fprintf(archivo, "%s %s\n", ETIQUETA_ASUNTO, correo.Asunto);

    /*Cargo la fecha y hora de envio del mensaje*/
    date = getFechaHoraEnviado(correo);
    tmPtr=localtime(&date);
    strftime(cad,DATE_SIZE,"%a, %d %b %Y %H:%M:%S %Z", tmPtr);
    fprintf(archivo, "%s %s", ETIQUETA_HORA, cad);

	/*Cargo el cuerpo del mensaje*/
    fprintf(archivo, "%s", correo.Cuerpo);

	return 0;
}
